#include <iostream>
#include <pthread.h>
#include <cerrno>
#include <cstring>
#include <unistd.h>

using namespace std;

void *func(void *args)
{
    pthread_detach(pthread_self());
    sleep(3);
    return nullptr;
    // int *arr = new int[5];
    // int count = 5;
    // while (count--)
    // {
    //     arr[count] = count;
    //     cout << "new thread:" << (char *)args << (void *)pthread_self() << endl;
    //     sleep(1);
    // }
    // 线程终止
    // pthread_cancel(pthread_self()); // #define PTHREAD_CANCELED ((void *) -1) // 未定义事件，不建议
    // pthread_exit((void*)arr);
    //return (void *)arr;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, func, (void *)"hello new thread : ");
    while (true)
    {
        cout << "new thread: running..." << (void *)pthread_self() << endl;
        sleep(1);
        break;
    }
    // pthread_cancel(tid);
    // 线程等待
    int *valptr;
    int ret = pthread_join(tid, (void **)&valptr);
    cout << ret << strerror(ret) << endl;
    // cout << ret << (long long)(valptr) << endl;
    // for (int i = 0; i < 5; ++i)
    // {
    //     cout << valptr[i] << endl;
    // }

    // void* valptr;
    // int ret = pthread_join(tid, &valptr);
    // for(int i = 0; i < 5; ++i)
    // {
    //     cout << ((int*)(valptr))[i] << endl;
    // }

    return 0;
}










// 
// void *threadRoutine(void *args)
// {

//     // pthread_cancel(pthread_self()); // 不推荐
//     // int i = 0;
//     // int *data = new int[10];
//     cout << "new thread quit ..." << endl;
//     sleep(5);
//     return nullptr;
// }

// int main()
// {
//     // 因为我们目前用的不是Linux自带的创建线程的接口，我们用的是pthread库中的接口！
//     pthread_t tid; // 本质是一个地址！
//     pthread_create(&tid, nullptr, threadRoutine, (void *)"thread 1");



//     // sleep(1); // bug线程没起来，就杀，没杀掉，未定义，后续。。。
//     pthread_cancel(tid);
//     cout << "pthread cancel: " << tid << endl;

//     int *ret = nullptr;
//     int r = pthread_join(tid, (void **)&ret); // 默认会阻塞等待新线程退出
//     cout << r << endl;

//     cout << "main thread wait done ... main quit ...: new thead quit : " << (long long)ret << "\n";
//     sleep(5);
//     return 0;
// }